查看原文
其他

精通Linux系列十四:这个做好了出了意外真能救命(备份和远程存储)

拾叁 更AI 2023-10-21

精通Linux系列点击关注公众号,AI&编程干货及时送达   


备份和远程存储

命令解释
rsync高效地复制一组文件(即使跨网络)
dd数据的低级复制。

有各种方式备份 Linux 文件:

  • • 将它们复制到备份介质,例如外部硬盘。

  • • 将它们刻录到可写入的 CD,DVD 或 Blu-ray 光盘。

  • • 将它们镜像到远程机器。

我们没有介绍所有的 Linux 备份命令。一些用户更喜欢 cpio,因为它灵活,一些老的管理员则坚称 dump 和 restore 是唯一可靠的备份所有类型文件的方式。如果你对这些程序感兴趣,我会面会专门写一篇来解释。

rsync

stdin  stdout  - file  -- opt  --help  --version

rsync [选项]  目标

rsync 命令复制一组文件。它可以做出完全相同的副本,包括文件权限和其他属性(称为镜像),或者它只是复制数据。它可以在网络上运行,也可以在单一机器上运行。rsync有许多用途和超过50个选项;我们只会介绍一些与备份相关的常见用例。

在单个机器上,将目录 mydir 及其内容镜像到另一个目录 mydir2 中:

 rsync -a mydir mydir2

rsync对指定第一个目录很小心。如果你像这里的例子那样写 mydir,那么该目录会被复制 进入 mydir2,创建 mydir2/mydir。这可能不是你想要的。如果你宁愿把 mydir 的 内容 复制到 mydir2 中,请在 mydir 后面添加一个斜线:

 rsync -a mydir/ mydir2

如果你想在网络上将目录 mydir 镜像到另一个主机,server.example.com,假设你在那里有一个用户名为“smith”的账户。rsync自动使用 SSH 安全连接,以防止窃听:

 rsync -a mydir smith@server.example.com:D2

如果你喜欢使用 rsync,但想要增量备份并高效地管理它们,可以查看 rsnapshot (http://rsnapshot.org/)。

有用的选项

-o复制文件的所有者。(你可能需要在远程主机上拥有超级用户权限。)
-g复制文件的组所有者。(你可能需要在远程主机上拥有超级用户权限。)
-p复制文件权限。
-t复制文件时间戳。
-r递归复制目录(即包括它们的内容)。
-l允许复制符号链接(不是它们指向的文件)。
-D允许复制设备。(仅限超级用户。)
-a镜像:复制原始文件的所有属性。这暗示了所有 -ogptrlD 的选项。
-x当复制文件树时,保持在当前文件系统内;不要跨越到其他已挂载的文件系统。
-n试运行模式:不要真正做任何复制。只是显示  做什么。
-v详细模式:打印在复制过程中发生的情况。添加 --progress 在复制文件时显示数字进度条。

dd

stdin  stdout  - file  -- opt  --help  --version

dd [选项]

dd 是一种低级别的位和字节复制器。它可以将数据从一个文件复制到另一个文件,比如,从 file1 到 file2

 dd if=fileA of=fileC
7+1 条记录输入
7+1 条记录输出
3816 字节 (3.8 kB) 已复制,0.000356028 s, 10.7 MB/s

它甚至可以在复制时进行数据转换。例如,你可以在文件之间传输数据时将所有字符转换为大写:

 dd if=fileA of=filecaps conv=ucase
7+1 条记录输入
7+1 条记录输出
3816 字节 (3.8 kB) 已复制,0.000389499 s, 9.8 MB/s

然而,dd 做的远不止复制文件。它可以通过从一个设备复制到另一个设备来克隆磁盘(警告!这将销毁目标设备上的所有数据!):

 sudo dd if=/dev/device1 of=/dev/device2 bs=512 \
  conv=noerror,sync

dd 在某种意义上是很简单的,因为只做 - 移动位 - 但它也很复杂,因为如果你不小心,你可以在几秒钟内 擦除你的硬盘。在作为超级用户使用 dd 之前,请备份你的电脑并。

访问 https://wiki.archlinux.org/index.php/Disk_cloning 以获取关于dd高级用法的一些建议。

我最喜欢的是将磁盘的主引导记录(MBR)复制到一个名为 mybootrecord 的文件中,其中MBR的长度为512字节:

 sudo dd if=/dev/device of=mybootrecord bs=512 \
count=1
if=*文件*指定一个输入文件或设备。
of=*文件*指定一个输出文件或设备。
bs=*N*一次复制 *N *字节,这被称为“块大小”。(要为输入和输出设置不同的块大小,请分别使用 ibs 和 obs。)
skip=*N*在开始复制之前,跳过 *N *个输入块。
seek=*N*在开始复制之前,丢弃 *N *个输出块。
conv=*spec*转换被复制的数据。*spec* 可以是 ucase(转换为大写)、lcase(转换为小写)、ascii(从EBCDIC转换为ASCII),以及在man手册页上列出的许多其他选项。

推荐阅读

··································

你好,我是拾叁,7年开发老司机、互联网两年外企5年。怼得过阿三老美,也被PR comments搞崩溃过。这些年我打过工,创过业,接过私活,也混过upwork。赚过钱也亏过钱。一路过来,给我最深的感受就是不管学什么,一定要不断学习。只要你能坚持下来,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯和编程知识,帮你积累弯道超车的资本。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存